package java_thinking.unit_19._19_7_9;

import java.util.EnumSet;

import static common.util.Print.print;

/**
 * @Desc:   JDK1.5开始加入的EnumSets，类似Set 功能
 *      1.与枚举类型一起使用的专用 Set 实现
 *      2.枚举 set 中所有键都必须来自单个枚举类型，该枚举类型在创建 set 时显式或隐式地指定
 *      3.枚举 set 在内部表示为位向量。此表示形式非常紧凑且高效。此类的空间和时间性能应该很好，足以用作传统上基于 int 
 *        的“位标志”的替换形式，具有高品质、类型安全的优势。如果其参数也是一个枚举 set，则批量操作(如 containsAll 和 
 *        retainAll)也应运行得非常快。
 *      4.不允许为null 会抛出NullPointerException；
 *      5.EnumSet 是不同步的 Set<MyEnum> s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));
 *      6.EnumSet 内部enum实例初始个数为long，最多可应用于64个元素的enum，但是如果超过这个个数也能存储
 *        RegularEnumSet enum内部实例<=64 时使用该类存储
 *        JumboEnumSet   enum内部实例>64 时使用该类存储
 *        目的是更为高效的存储过程
 *      7.此类是 Java Collections Framework 的成员。
 * @author: cww
 * @DateTime: 2019/5/23 14:51
 */

public class EnumSets {
    public static void main(String[] args) {
        //创建一个空的Set
        EnumSet<AlarmPoints> points = EnumSet.noneOf(AlarmPoints.class);
        points.add(AlarmPoints.BATHROOM);
        print("add " + points);
        points.addAll(EnumSet.of(AlarmPoints.STAIR1, AlarmPoints.STAIR2, AlarmPoints.KITCHEN));
        print("addAll " + points);
        points = EnumSet.allOf(AlarmPoints.class);
        print("allOf " + points);
        points.removeAll(EnumSet.of(AlarmPoints.STAIR1, AlarmPoints.STAIR2, AlarmPoints.KITCHEN));
        print("removeAll " + points);
        points.removeAll(EnumSet.range(AlarmPoints.OFFICE1, AlarmPoints.OFFICE4));
        print(points);
        points = EnumSet.complementOf(points);
        print("complementOf " + points);


    }
}

class BigEnumSet {
    enum Big {
        A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25,A26,A27,A28,A29,A30,A31,A32,A33,A34,A35,A36,A37,A38,A39,A40,A41,A42,A43,A44,A45,A46,A47,A48,A49,A50,A51,A52,A53,A54,A55,A56,A57,A58,A59,A60,A61,A62,A63,A64,A65,A66,A67,A68,A69,A70,A71,A72,A73,A74
    }

    public static void main(String[] args) {
        EnumSet<Big> big = EnumSet.allOf(Big.class);
        System.out.println(big);
    }
}